home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 101-125 / disk_114 / cdecl / cdgram.y < prev    next >
Text File  |  1992-05-06  |  5KB  |  256 lines

  1. %{
  2. #include <stdio.h>
  3.  
  4. #define    MB_SHORT    0001
  5. #define    MB_LONG        0002
  6. #define    MB_UNSIGNED    0004
  7. #define MB_INT        0010
  8. #define MB_CHAR        0020
  9. #define MB_FLOAT    0040
  10. #define MB_DOUBLE    0100
  11.  
  12. int modbits = 0;
  13. int arbdims = 1;
  14. char *savedtype;
  15. char *savedname;
  16. char *ds(), *cat();
  17. char *index(), *malloc();
  18. char prev;
  19. %}
  20.  
  21. %union {
  22.     char *dynstr;
  23.     struct {
  24.         char *left;
  25.         char *right;
  26.     } halves;
  27. }
  28.  
  29. %token DECLARE CAST INTO AS HELP EXPLAIN
  30. %token FUNCTION RETURNING POINTER TO ARRAY OF
  31. %token <dynstr> NAME NUMBER STRUCTUNION UNSIGNED LONG SHORT
  32. %token <dynstr> INT CHAR FLOAT DOUBLE
  33. %type <dynstr> mod_list tname type modifier
  34. %type <dynstr> cdecl cdecl1 cdims adims c_type
  35. %type <halves> adecl
  36.  
  37. %start prog
  38.  
  39. %%
  40. prog    : /* empty */
  41.         | prog stat
  42.         ;
  43.  
  44. stat    : HELP '\n'
  45.             {
  46.             help();
  47.             }
  48.         | DECLARE NAME AS adecl '\n'
  49.             {
  50.             printf("%s %s%s%s",savedtype,$4.left,$2,$4.right);
  51. #ifdef MKPROGRAM
  52.             if (prev == 'f')
  53.                 printf("\n{\n}\n");
  54.             else
  55.                 printf(";\n");
  56. #else
  57.             printf("\n");
  58. #endif
  59.             free($4.left);
  60.             free($4.right);
  61.             free($2);
  62.             }
  63.         | CAST NAME INTO adecl '\n'
  64.             {
  65.             if (prev == 'f')
  66.                 unsupp("Cast into function");
  67.             else if (prev=='A' || prev=='a')
  68.                 unsupp("Cast into array");
  69.             printf("(%s",savedtype);
  70.             if (strlen($4.left)+strlen($4.right))
  71.                 printf(" %s%s",$4.left,$4.right);
  72.             printf(")%s\n",$2);
  73.             free($4.left);
  74.             free($4.right);
  75.             free($2);
  76.             }
  77.         | EXPLAIN type cdecl '\n'
  78.             { printf("declare %s as %s%s\n",savedname,$3,$2); }
  79.         | '\n'
  80.         | error '\n'
  81.             {
  82.             yyerrok;
  83.             }
  84.         ;
  85.  
  86. cdecl    : cdecl1
  87.         | '*' cdecl
  88.             { $$ = cat($2,ds("pointer to "),NULL); }
  89.         ;
  90.  
  91. cdecl1    : cdecl1 '(' ')'
  92.             { $$ = cat($1,ds("function returning "),NULL); }
  93.         | cdecl1 cdims
  94.             { $$ = cat($1,ds("array "),$2); }
  95.         | '(' cdecl ')'
  96.             { $$ = $2; }
  97.         | NAME
  98.             {
  99.                 savename($1);
  100.                 $$ = ds("");
  101.             }
  102.         ;
  103.  
  104. cdims    : '[' ']'
  105.             { $$ = ds("of "); }
  106.         | '[' NUMBER ']'
  107.             { $$ = cat($2,ds(" of "),NULL); }
  108.         ;
  109.  
  110. adecl    : FUNCTION RETURNING adecl
  111.             {
  112.             if (prev == 'f')
  113.                 unsupp("Function returning function");
  114.             else if (prev=='A' || prev=='a')
  115.                 unsupp("Function returning array");
  116.             $$.left = $3.left;
  117.             $$.right = cat(ds("()"),$3.right,NULL);
  118.             prev = 'f';
  119.             }
  120.         | FUNCTION '(' NAME ')' RETURNING adecl
  121.             {
  122.             if (prev == 'f')
  123.                 unsupp("Function returning function");
  124.             else if (prev=='A' || prev=='a')
  125.                 unsupp("Function returning array");
  126.             $$.left = $6.left;
  127.             $$.right = cat(ds("("),$3,ds(")"));
  128.             $$.right = cat($$.right,$6.right,NULL);
  129.             prev = 'f';
  130.             }
  131.         | ARRAY adims OF adecl
  132.             {
  133.             if (prev == 'f')
  134.                 unsupp("Array of function");
  135.             else if (prev == 'a')
  136.                 unsupp("Inner array of unspecified size");
  137.             if (arbdims)
  138.                 prev = 'a';
  139.             else
  140.                 prev = 'A';
  141.             $$.left = $4.left;
  142.             $$.right = cat($2,$4.right,NULL);
  143.             }
  144.         | POINTER TO adecl
  145.             {
  146.             if (prev == 'a')
  147.                 unsupp("Pointer to array of unspecified dimension");
  148.             if (prev=='a' || prev=='A' || prev=='f') {
  149.                 $$.left = cat($3.left,ds("(*"),NULL);
  150.                 $$.right = cat(ds(")"),$3.right,NULL);
  151.             } else {
  152.                 $$.left = cat($3.left,ds("*"),NULL);
  153.                 $$.right = $3.right;
  154.             }
  155.             prev = 'p';
  156.             }
  157.         | type
  158.             {
  159.             savetype($1);
  160.             $$.left = ds("");
  161.             $$.right = ds("");
  162.             prev = 't';
  163.             }
  164.         ;
  165.  
  166. adims    : /* empty */
  167.             {
  168.             arbdims = 1;
  169.             $$ = ds("[]");
  170.             }
  171.         | NUMBER
  172.             {
  173.             arbdims = 0;
  174.             $$ = cat(ds("["),$1,ds("]"));
  175.             }
  176.         ;
  177.  
  178. type    : tinit c_type
  179.             { mbcheck(); $$ = $2; }
  180.         ;
  181.  
  182. tinit    : /* empty */
  183.             { modbits = 0; }
  184.         ;
  185.  
  186. c_type    : mod_list
  187.             { $$ = $1; }
  188.         | tname
  189.             { $$ = $1; }
  190.         | mod_list tname
  191.             { $$ = cat($1,ds(" "),$2); }
  192.         | STRUCTUNION NAME
  193.             { $$ = cat($1,ds(" "),$2); }
  194.         ;
  195.  
  196. tname    : INT
  197.             { modbits |= MB_INT; $$ = $1; }
  198.         | CHAR
  199.             { modbits |= MB_CHAR; $$ = $1; }
  200.         | FLOAT
  201.             { modbits |= MB_FLOAT; $$ = $1; }
  202.         | DOUBLE
  203.             { modbits |= MB_DOUBLE; $$ = $1; }
  204.         ;
  205.  
  206. mod_list: modifier
  207.             { $$ = $1; }
  208.         | mod_list modifier
  209.             { $$ = cat($1,ds(" "),$2); }
  210.         ;
  211.  
  212. modifier: UNSIGNED
  213.             { modbits |= MB_UNSIGNED; $$ = $1; }
  214.         | LONG
  215.             { modbits |= MB_LONG; $$ = $1; }
  216.         | SHORT
  217.             { modbits |= MB_SHORT; $$ = $1; }
  218.         ;
  219. %%
  220. #include "cdlex.c"
  221.  
  222. #define LORS    (MB_LONG|MB_SHORT)
  223. #define UORL    (MB_UNSIGNED|MB_LONG)
  224. #define UORS    (MB_UNSIGNED|MB_SHORT)
  225. #define CORL    (MB_CHAR|MB_LONG)
  226. #define CORS    (MB_CHAR|MB_SHORT)
  227. #define CORU    (MB_CHAR|MB_UNSIGNED)
  228.  
  229. mbcheck()
  230. {
  231.     if ((modbits&LORS) == LORS)
  232.         unsupp("conflicting 'short' and 'long'");
  233.     if ((modbits&UORL) == UORL)
  234.         unport("unsigned with long");
  235.     if ((modbits&UORS) == UORS)
  236.         unport("unsigned with short");
  237.     if ((modbits&CORL) == CORL)
  238.         unsupp("long char");
  239.     if ((modbits&CORS) == CORS)
  240.         unsupp("short char");
  241.     if ((modbits&CORU) == CORU)
  242.         unport("unsigned char");
  243. }
  244.  
  245. savetype(s)
  246. char *s;
  247. {
  248.     savedtype = s;
  249. }
  250.  
  251. savename(s)
  252. char *s;
  253. {
  254.     savedname = s;
  255. }
  256.